# -*- coding: utf-8 -*-
# @Date：2024/9/30 11:53:26
# @Author：CJiaの青姝
# @FileName：cj_crud
# @Editor：PyCharm2024
# @Remark：
import os
import openpyxl
from datetime import datetime

from django.http import FileResponse
from django.forms import model_to_dict
from django.shortcuts import get_object_or_404
from backend.settings import BASE_DIR

from .userinfo import get_user_info_from_token
from .cj_ninja import CjFilters


def create(request, model, data):
    """
    创建新记录的函数。
    :param request: 请求对象，用于获取用户信息。
    :param model: Django ORM模型，指定要创建的对象类型。
    :param data: 创建记录的数据，可以是字典或者支持dict()方法的对象。
    :return: 创建成功的对象查询集合，方便获取id创建有关子表联系。
    """
    if not isinstance(data, dict):
        # 如果data不是字典类型，则转换为字典
        data = data.dict()
    # 从请求中获取用户信息
    from auths.models import User
    user_info = get_object_or_404(User, id=request.user_id)
    # 从请求中提取用户信息，并添加到数据中作为创建人、修改者、以及数据所属部门
    data['creator'] = user_info.username
    data['modifier'] = user_info.username
    # 使用提供的模型和数据创建新记录
    query_set = model.objects.create(**data)
    # 完整新增数据
    return model_to_dict(query_set)


def delete(model, uuid):
    """
    根据提供的ID和模型删除对象实例。
    :param model: 对象所属的模型类。
    :param uuid: 要删除的对象的ID。
    :return:
        - 200 删除对象实例
        - 404 ID不存在
    """
    try:
        # 删除成功
        query_set = model.objects.get(id=uuid)
        query_set.delete()
        # 返回删除对象
        return model_to_dict(query_set), 200
    except model.DoesNotExist:
        # 删除失败
        return "删除的对象不存在", 404


def batch_delete(request, model, ids):
    """
    根据提供的ID数组和批量模型删除对象实例。
    :param request: HTTP请求对象，用于获取用户信息。
    :param model: 对象所属的模型类。
    :param ids: id数组
    :return: 删除的情况
    """
    # 查出当前id存在的对象，进行删除
    query_set = model.objects.filter(id__in=ids).delete()
    # 返回删除结果
    return query_set[0], len(ids) - query_set[0]


def update(request, model, data, uuid):
    """
    更新给定模型实例的数据。
    :param request: HTTP请求对象，用于获取用户信息。
    :param model: 要更新的模型类。
    :param data: 包含更新数据的实例，应能转换为字典格式。
    :param uuid: 要更新的模型实例的ID。
    :return: 更新后的模型实例，方便更新相关id子表。
    """
    if not isinstance(data, dict):
        # 如果data不是字典类型，则转换为字典
        data = data.dict()
    # 从请求中获取用户信息
    from auths.models import User
    user_info = get_object_or_404(User, id=request.user_id)
    # 为更新的数据添加修改者信息、所属部门信息
    data['modifier'] = user_info.username
    # 获取指定ID的模型实例
    instance = get_object_or_404(model, id=uuid)
    # 遍历字典，将更新的数据设置到模型实例上
    for attr, value in data.items():
        setattr(instance, attr, value)
    instance.save()  # 保存更新
    # 返回更新后的实例
    return model_to_dict(instance)


def retrieve(request, model, related, filters: CjFilters = CjFilters()):
    """
    根据提供的过滤条件从数据库中检索模型实例。
    :param request: HttpRequest对象，用于获取请求信息。
    :param model: Django模型类，指定要检索的数据模型。
    :param related: related外键查询字段
    :param filters: CjFilters类的实例，包含过滤条件。默认为CjFilters()，即无条件过滤。
    :return: 一个Django QuerySet对象，包含根据过滤条件检索到的模型实例。
    """
    # 将filters空字符串转换为None
    for attr, value in filters.__dict__.items():
        if getattr(filters, attr) == '':
            setattr(filters, attr, None)
        elif attr != 'status':
            pass
    data = filters.dict(exclude_none=True)
    # 过滤指定字段
    query = {}
    for key, value in data.items():
        if key == 'status':
            query[key] = value
        elif 'id' in key:
            query[key] = value
        else:
            query[key + '__contains'] = value
    # 查询数据
    query_set = model.objects.filter(**query).select_related(*related)
    # 返回结果
    return query_set


def single(request, model, related, uuid):
    """
    根据提供的id条件从数据库中检索模型实例。
    :param request: HttpRequest对象，用于获取请求信息。
    :param model: Django模型类，指定要检索的数据模型。
    :param related: related外键查询字段
    :param uuid: 要查询的模型实例的ID。
    :return:
        - 一个Django QuerySet对象，包含根据id检索到的模型实例。
        - 方便操作获取子表。
    """
    # 获取指定对象
    query_set = model.objects.filter(id=uuid).select_related(*related).first()
    if query_set:
        # 返回对象
        return query_set, 200
    # 不存在
    return "获取失败, ID不存在", 404
